/**
 * Created by zhourh on 2018/5/24.
 *
 * 你和你的朋友，两个人一起玩Nim游戏：桌子上有一堆石头，每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。

 你们是聪明人，每一步都是最优解。 编写一个函数，来判断你是否可以在给定石头数量的情况下赢得游戏。

 示例:

 输入: 4
 输出: false
 解释: 如果堆中有 4 块石头，那么你永远不会赢得比赛；
 因为无论你拿走 1块、2块 还是 3块石头，最后一块石头总是会被你的朋友拿走。

 使用递归方式虽然可以解出答案，但是耗时，通过查询规律得出答案
 */
public class NimGame {

    public static void main(String[] args) {
        NimGame nimGame = new NimGame();
        System.out.println("1:" + nimGame.canWinNim(1));
        System.out.println("2:" + nimGame.canWinNim(2));
        System.out.println("3:" + nimGame.canWinNim(3));
        System.out.println("4:" + nimGame.canWinNim(4));
        System.out.println("5:" + nimGame.canWinNim(5));
        System.out.println("6:" + nimGame.canWinNim(6));
        System.out.println("7:" + nimGame.canWinNim(7));
        System.out.println("8:" + nimGame.canWinNim(8));
        System.out.println("9:" + nimGame.canWinNim(9));
        System.out.println("10:" + nimGame.canWinNim(10));
        System.out.println("11:" + nimGame.canWinNim(11));
        System.out.println("12:" + nimGame.canWinNim(12));
        System.out.println("13:" + nimGame.canWinNim(13));
        System.out.println("14:" + nimGame.canWinNim(14));
        System.out.println("15:" + nimGame.canWinNim(15));
        System.out.println("42:" + nimGame.canWinNim(42));
    }
    public boolean canWinNim(int n) {
        return n % 4 != 0;
    }


    public boolean canWinNim2(int n) {
        if (n >= 1 && n <= 3) {
            return true;
        }
        return !canWinNim(n - 1) || !canWinNim(n - 2) || !canWinNim(n - 3);
    }
}
